前一篇我們介紹了 CNI 的分類,這邊將個別介紹這些 CNI。
在主機與容器之間創建一個 linux bridge 連接。
是一種 Linux 下的網路模式,能夠將多個 NIC Adapter ports 透過一個虛擬出來 Bridge(Switch) 全部串在一起並透過虛擬的網路裝置轉發出去。
CNI 的配置檔
{
"cniVersion": "0.3.0",
"name": "mynet",
"type": "bridge",
"bridge": "mynet0",
"isDefaultGateway": true,
"forceAddress": false,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.10.0.0/16"
}
}
在容器內創建 ipvlan 介面。
分為 L2 模式 L3模式,一個主介面只能選擇一種模式,無法混用。
CNI 的配置檔
{
"name": "mynet",
"type": "ipvlan",
"master": "eth0",
"ipam": {
"type": "host-local",
"subnet": "10.1.2.0/24"
}
}
創建新的 MAC 位址,並轉發所有流量到容器內。
允許在主機的一個 NIC 上配置多個虛擬的 NIC,這些 NIC 有自己獨立的 MAC 地址,也可以配置上 IP address 進行通訊。
在 macvlan 下的 虛擬機 或者 容器 的網路和 主機 都在同一個網段中,共享同一個 broadcast domain。
CNI 的配置檔
{
"name": "mynet",
"type": "macvlan",
"master": "eth0",
"ipam": {
"type": "dhcp"
}
}
於主機和容器之間建立 veth pair。
可以把 veth pair 當做是雙向的 pipe(管道),從一个方向發送的網路封包,可以直接被另外一端接收到;或者也可以想象成兩個 namespace 直接通過一個特殊的虛擬網卡連接起来,可以直接通訊。
CNI 的配置檔
{
"name": "mynet",
"type": "ptp",
"ipam": {
"type": "host-local",
"subnet": "10.1.1.0/24"
},
"dns": {
"nameservers": [ "10.1.1.1", "8.8.8.8" ]
}
}
這裡以 bridge & host-local CNI 為例,透過 linux network namespace 切割網路環境。
下載 CNI tool
$ curl -O -L https://github.com/containernetworking/cni/releases/download/v0.5.2/cni-amd64-v0.5.2.tgz
tar -xzvf cni-amd64-v0.5.2.tgz
創建網路環境
$ ip netns add ns1
$ ip netns add ns2
建立配置檔
cat > bridge.conf <<"EOF"
{
"name": "bridge",
"type": "bridge",
"bridge": "br0",
"isGateway": true,
"isDefaultGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/16",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"gateway": "10.244.1.1"
}
}
EOF
配置 Network namespaces
$ CNI_COMMAND=ADD CNI_CONTAINERID=ns1 CNI_NETNS=/var/run/netns/ns1 CNI_IFNAME=eth3 CNI_PATH=`pwd` ./bridge <bridge.conf
{
"ip4": {
"ip": "10.244.0.1/16",
"gateway": "10.244.1.1",
"routes": [
{
"dst": "0.0.0.0/0",
"gw": "10.244.1.1"
},
{
"dst": "0.0.0.0/0",
"gw": "10.244.1.1"
}
]
},
"dns": {}
}
-----
$ CNI_COMMAND=ADD CNI_CONTAINERID=ns2 CNI_NETNS=/var/run/netns/ns2 CNI_IFNAME=eth3 CNI_PATH=`pwd` ./bridge <bridge.conf
{
"ip4": {
"ip": "10.244.0.2/16",
"gateway": "10.244.1.1",
"routes": [
{
"dst": "0.0.0.0/0",
"gw": "10.244.1.1"
},
{
"dst": "0.0.0.0/0",
"gw": "10.244.1.1"
}
]
},
"dns": {}
}
確認網路連線
$ ip netns exec ns1 ping 10.244.0.2
PING 10.244.0.2 (10.244.0.2) 56(84) bytes of data.
64 bytes from 10.244.0.2: icmp_seq=1 ttl=64 time=0.148 ms
64 bytes from 10.244.0.2: icmp_seq=2 ttl=64 time=0.071 ms
-----
$ ip netns exec ns2 ping 10.244.0.1
PING 10.244.0.1 (10.244.0.1) 56(84) bytes of data.
64 bytes from 10.244.0.1: icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from 10.244.0.1: icmp_seq=2 ttl=64 time=0.060 ms
https://feisky.gitbooks.io/kubernetes/network/cni/
https://github.com/containernetworking/cni